package 哈希;
import java.util.*;

/**
 * 两数之和问题解决方案
 * 给定一个整数数组 nums 和一个目标值 target，找出数组中两个数的和等于目标值的下标
 */
public class twoSum {
    /**
     * 使用哈希表解决两数之和问题
     * @param nums 整数数组
     * @param target 目标值
     * @return 包含两个下标的一维数组，如果未找到则返回[-1, -1]
     */
    public static int[] twoSumM(int[] nums, int target){
        // 创建哈希表，用于存储数组中的值和对应的下标
        // key: 数组中的值，value: 对应的下标
        HashMap<Integer, Integer> map = new HashMap<>();
        
        // 遍历数组中的每个元素
        for(int i = 0; i < nums.length; i++){
            // 检查哈希表中是否存在与当前元素相加等于目标值的数
            if(map.containsKey(target - nums[i])){
                // 如果存在，返回当前下标和哈希表中存储的下标
                return new int[]{i, map.get(target - nums[i])};
            }
            // 将当前元素及其下标存入哈希表
            map.put(nums[i], i);
        }
        // 如果遍历完整个数组都没有找到符合条件的数对，返回[-1, -1]
        return new int[]{-1, -1};
    }

    /**
     * 主函数，用于测试twoSumM方法
     * 输入格式：第一行输入数组元素（空格分隔），第二行输入目标值
     */
    public static void main(String[] args){
        // 创建Scanner对象用于读取输入
        Scanner sc = new Scanner(System.in);
        
        // 读取第一行输入，按空格分割成字符串数组
        String[] s = sc.nextLine().split(" ");
        
        // 创建整数数组，长度与输入的字符串数组相同
        int nums[] = new int[s.length];
        
        // 读取目标值
        int target = sc.nextInt();
        
        // 将字符串数组转换为整数数组
        for(int i = 0; i < s.length; i++){
            nums[i] = Integer.parseInt(s[i]);
        }
        
        // 调用twoSumM方法并输出结果
        System.out.println(Arrays.toString(twoSumM(nums, target)));
        
        // 关闭Scanner对象
        sc.close();
    }
}
